package study.activiti.a_helloworld;

import java.util.List;

import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.junit.Test;

/**  
* @Name: HelloWorld
* @Description: 第一个工作流程序：演示流程定义的部署、启动、查看个人任务、办理个人任务
* @Author: 李超
* @Create Date: 2016-12-11
*/
public class HelloWorld {
	
	//获取流程引擎对象
	private ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine() ;
	
	/**  
	* @Name: deploymentProcessDefinition（方法的名称）
	* @Description: 第1步：部署流程定义（方法的描述）
	* @Author: 李超（作者）
	* @Version: V1.00 （版本号）
	* @Create Date: 2016-12-11 （创建日期）
	* @Parameters: 无（方法的入参，如果没有，填写为“无”）
	* @Return: 无（返回值，如果没有，填写为“无”）
	*/
	@Test
	public void deploymentProcessDefinition() {
		//部署流程资源文件，获取部署对象：部署对象类似于hibernate中的持久化对象，内部存放操作数据表字段的属性及对应的方法
		Deployment deployment = processEngine.getRepositoryService() //RepositoryService：与流程定义和部署对象相关的Service
					 .createDeployment() //创建一个部署对象
					 .name("helloworld入门程序") //添加部署流程的名称
					 .addClasspathResource("diagrams/Helloworld.bpmn") //从类路径下加载资源文件，一次只能加载一个文件
					 .addClasspathResource("diagrams/Helloworld.png")
					 .deploy() ; //完成部署，返回部署对象
		System.out.println("id[部署id]：" + deployment.getId()); //1，为act_re_deployment表中的ID_字段值
		System.out.println("name[部署名称]：" + deployment.getName()); //helloworld入门程序，为act_re_deployment表中的NAME_字段值
	}
	
	/**  
	* @Name: startProcessInstance（方法的名称）
	* @Description: 第2步：启动流程实例（方法的描述）
	* @Author: 李超（作者）
	* @Version: V1.00 （版本号）
	* @Create Date: 2016-12-11 （创建日期）
	* @Parameters: 无（方法的入参，如果没有，填写为“无”）
	* @Return: 无（返回值，如果没有，填写为“无”）
	*/
	@Test
	public void startProcessInstance() {
		//流程定义的key
		String processDefinitionKey = "helloworld" ;
		//启动流程，获取流程实例对象,流程实例对象类似于hibernate中的持久化对象，内部存放操作对应数据表字段的属性及方法
		ProcessInstance instance = processEngine.getRuntimeService() //RuntimeService：与正在执行的流程实例和执行对象相关的Service
					 .startProcessInstanceByKey(processDefinitionKey) ; //使用流程定义的key启动流程实例，key对应helloworld.bpmn文件中id的属性值，使用key启动的优势：默认会按照最新版本启动流程实例
		System.out.println("pid[流程实例id]:" + instance.getId()); //10001，为act_ru_task表中的ID_字段值
		System.out.println("activitiId[流程定义id]:" + instance.getProcessDefinitionId()); //helloworld:4:7504，为act_re_procdef表中的ID_字段值
	}
	
	/**  
	* @Name: startProcessInstance（方法的名称）
	* @Description: 第3步：查询当前人的个人任务（方法的描述）
	* @Author: 李超（作者）
	* @Version: V1.00 （版本号）
	* @Create Date: 2016-12-11 （创建日期）
	* @Parameters: 无（方法的入参，如果没有，填写为“无”）
	* @Return: 无（返回值，如果没有，填写为“无”）
	*/
	@Test
	public void findMyPersonalTask() {
		//指定任务办理人
		String assignee = "张三" ;
		//返回任务集合
		List<Task> list = processEngine.getTaskService() //TaskService：与正在执行的任务管理相关的Service
		 			 .createTaskQuery() //创建任务查询对象
		 			 .taskAssignee(assignee) //个人任务查询，指定办理人
		 			 .list() ;
		if(list != null && list.size() > 0) {
			for (Task task : list) {
				//遍历输出任务对象task中的属性，对应数据表act_ru_task中的字段
				System.out.println("任务id:" + task.getId());
				System.out.println("任务名称:" + task.getName());
				System.out.println("任务创建时间:" + task.getCreateTime());
				System.out.println("任务办理人:" + task.getAssignee());
				System.out.println("流程实例id:" + task.getProcessInstanceId());
				System.out.println("流程执行对象id:" + task.getExecutionId());
				System.out.println("流程定义id:" + task.getProcessDefinitionId());
				System.out.println("########################################");
			}
		}
	}
	
	/**  
	* @Name: completeMyPersonalTask（方法的名称）
	* @Description: 第4步：办理（完成）当前人的个人任务（方法的描述）
	* @Author: 李超（作者）
	* @Version: V1.00 （版本号）
	* @Create Date: 2016-12-11 （创建日期）
	* @Parameters: 无（方法的入参，如果没有，填写为“无”）
	* @Return: 无（返回值，如果没有，填写为“无”）
	*/
	@Test
	public void completeMyPersonalTask() {
		//任务id
		String taskId = "12504" ;
		processEngine.getTaskService() //TaskService：与正在执行的任务管理相关的Service
					 .complete(taskId) ; //办理(完成)我的个人任务
		System.out.println("完成任务：任务id为" + taskId);
	}


}






